//
// 网络连接，数据发送管理
// Created by kenny on 25-10-20.
//

#ifndef NETWORK_MANAGER_H
#define NETWORK_MANAGER_H

#include "mcp_tcp.h"  // 将原来的socket_manager.h重命名为tcp_socket_manager.h
#include "mcp_udp.h"
#include <stdint.h>
#include <stdbool.h>

// 连接类型
typedef enum {
    CONNECTION_TYPE_NONE = 0,
    CONNECTION_TYPE_TCP,
    CONNECTION_TYPE_UDP
} connection_type_t;

// 统一的网络管理器
typedef struct {
    connection_type_t current_type;

    // TCP管理器
    mcp_tcp_t tcp_manager;

    // UDP管理器
    mcp_udp_t udp_manager;

    // 通用回调
    void (*recv_callback)(uint8_t* data, uint16_t length);
    void (*udp_recv_callback)(uint8_t* data, uint16_t length, const char* from_ip, int from_port);
    void (*status_callback)(bool connected, const char* reason);

} mcp_net_t;

/**
 * 初始化
 * @param manager
 * @param recv_cb      TCP 接收数据的回调
 * @param udp_recv_cb  UDP 接收到回调
 * @param status_cb    连接状态回调
 * @return
 */
int mcp_net_init(mcp_net_t* manager,
                         void (*recv_cb)(uint8_t* data, uint16_t length),
                         void (*udp_recv_cb)(uint8_t* data, uint16_t length, const char* from_ip, int from_port),
                         void (*status_cb)(bool connected, const char* reason));
/**
 * 网络是否已连接
 * @param manager
 * @return
 */
bool mcp_net_is_connected(mcp_net_t* manager);


/**
 * TCP
 * @param manager
 * @param ip
 * @param port
 * @return
 */
int mcp_net_connect_tcp(mcp_net_t* manager, const char* ip, int port);
int mcp_net_send(mcp_net_t* manager, const uint8_t* data, uint16_t length);
int mcp_net_close(mcp_net_t* manager);

/**
 * UDP
 * @param manager
 * @param ip
 * @param port
 * @return
 */
int mcp_net_connect_udp(mcp_net_t* manager, const char* ip, int port);
int mcp_net_send_udp_to(mcp_net_t* manager, const uint8_t* data, uint16_t length,
                               const char* dest_ip, int dest_port);

/**
 * 取得连接类型，TCP还是UDP
 * @param manager
 * @return
 */
connection_type_t mcp_net_get_current_type(mcp_net_t* manager);

/**
 * 清理资源
 * @param manager
 */
void mcp_net_cleanup(mcp_net_t* manager);

#endif // mcp_net_H